# Observable

Observable is a collaborative data notebook.

Here's a short video guide on how to connect Observable to Cube.

<LoomVideo url="https://www.loom.com/embed/969ddf03e90e406eb7d63ca4a77ee7c7" />

## Connect from Cube Cloud

Navigate to the [Integrations](/product/workspace/integrations#connect-specific-tools)
page, click <Btn>Connect to Cube</Btn>, and choose <Btn>Observable</Btn> to get
detailed instructions.

## Connect from Cube Core

You can connect a Cube deployment to Observable using the [SQL API][ref-sql-api]
or the [REST API][ref-rest-api].

In Cube Core, the SQL API is disabled by default. Enable it and [configure
the credentials](/product/apis-integrations/sql-api#configuration) to
connect to Observable.

## Connecting from Observable

### Connecting via SQL API

Observable connects to Cube as to a Postgres database.

<Screenshot src="https://ucarecdn.com/2f0577f5-4717-4001-bfef-050827c5a415/" />

### Querying data with SQL API

Your cubes will be exposed as tables, where both your measures and dimensions
are columns.

Make sure to add a database to your notebook, and select **Database query** when
adding a new block.

<div style={{ textAlign: "center" }}>
  <img
    src="https://ucarecdn.com/83b5f0ec-4134-413a-aaa0-2794d9bc34ed/"
    style={{ border: "none" }}
    width="100%"
  />
</div>

You can write SQL in Observable that will be executed in Cube. Learn more about
Cube SQL syntax on the [reference page][ref-sql-api].

<div style={{ textAlign: "center" }}>
  <img
    src="https://ucarecdn.com/5a4705c2-d675-4a50-b193-847b95177fb5/"
    style={{ border: "none" }}
    width="100%"
  />
</div>

You can also create a visualization of the executed SQL query.

<div style={{ textAlign: "center" }}>
  <img
    src="https://ucarecdn.com/a61ec062-b6c7-4c33-be10-bf1cd5826a77/"
    style={{ border: "none" }}
    width="100%"
  />
</div>

### Connecting via REST API

For a Cube instance publicly available at a specific `HOST`, the REST API URL
would be `HOST/cubejs-api/v1`. Please refer to the
[REST API page](/product/apis-integrations/rest-api) for details.

You will also need to generate a JSON Web Token that would be used to
authenticate requests to Cube.

Please check the [Security page](/product/auth/methods/jwt#generating-json-web-tokens)
to learn how to generate a token. We suggest generating a long-lived JWT that
won't expire soon.

### Querying data with REST API

First, add two generic **JavaScript** cells:

<div style={{ textAlign: "center" }}>
  <img
    src="https://ucarecdn.com/2384bda2-a56c-4376-9b07-efbdff09455a/"
    style={{ border: "none" }}
    width="100%"
  />
</div>

Next, copy Cube's REST API URL and the Authorization token and paste them into
their respective cells.

```javascript
cubeRestApi =
  "https://thirsty-raccoon.aws-eu-central-1.cubecloudapp.dev/cubejs-api/v1/load";
```

Because the Cube REST API has the format of `HOST/cubejs-api/v1`, don't forget
to add the `/load` endpoint to the end of the data source API.

```javascript
cubeRestApiJwtToken =
  "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2NTgzMzM3OTZ9.gUOoDgo_RJka_ZANdwSw3v8GkM4ZzH9LjxrxKxkGAk0";
```

Also make sure to add the token next to the Bearer part of the Authorization
header.

Get your Cube query in the JSON
[query format](/product/apis-integrations/rest-api/query-format) ready. You can
copy it from Cube's Playground or compose manually.

Paste the JSON query in another JavaScript cell as an object literal and give it
a name, I chose `jsonBody` for simplicity. Make sure to add a `query` parameter
for your JSON query.

```javascript
jsonQuery = {
  query: {
    measures: ["orders.count"],
    timeDimensions: [
      {
        dimension: "orders.created_at",
        granularity: "month"
      }
    ],
    order: {
      "orders.created_at": "asc"
    }
  }
}
```

Next, create another JavaScript cell with a POST request. Paste this POST
request in the cell. Don't forget to put the `jsonBody` object inside the
`JSON.stringify` call.

```javascript
orders_over_time = fetch(cubeRestApi, {
  method: "POST",
  headers: {
    Authorization: cubeRestApiJwtToken,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(jsonQuery),
})
  .then((response) => response.json())
  .then((json) => json.data);
```

Next, click the play button on the top right of the cell.

<div style={{ textAlign: "center" }}>
  <img
    src="https://ucarecdn.com/60eb940c-74b0-416f-bfc4-e6efee55f455/"
    style={{ border: "none" }}
    width="100%"
  />
</div>

You can also create a visualization of the executed REST API request.

<div style={{ textAlign: "center" }}>
  <img
    src="https://ucarecdn.com/2f414e15-38f0-4688-a7e7-5eb1be3027aa/"
    style={{ border: "none" }}
    width="100%"
  />
</div>

[ref-sql-api]: /product/apis-integrations/sql-api
[ref-rest-api]: /product/apis-integrations/rest-api
